linux 内核参数优化

前言

通过调整内核参数,我们可以设置端口使用范围,单进程最大可打开的文件描述符数量,tcp收发缓冲区大小,设置TCP连接队列和半连接队列的大小等来优化服务器的性能,尽可能在硬件条件有限的情况下,压榨服务器的性能,使其达到最优。

修改内核参数方法

  1. 使用echo value方式直接追加到文件里,如echo “1” > /proc/sys/net/ipv4/tcp_syn_retries,但这种方法机器重启后又会恢复为默认值,不具备永久性。

  2. 使用sysctl命令动态修改内核参数值,例如:sysctl -w net.ipv4.ip_forward=1,重启后又会恢复为默认值,不具备永久性。

  3. 把参数添加到/etc/sysctl.conf中,然后执行sysctl -p使参数生效,永久生效。

sysctl命令

sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/IP内核参数和虚拟内存系统的高级选项。

  1. 打印所有的内核参数变量和值

    sysctl -a
  2. 查询某一内核参数值

    sysctl -a | grep net.ipv4.ip_forward
  3. 从配置文件“/etc/sysctl.conf”加载内核参数设置

    sysctl -p
  4. 动态修改内核参数值(重启后恢复默认值,不具备永久性)

    sysctl -w net.ipv4.ip_forward=1

模糊查询TCP/IP相关内核参数值(1:启用,0:禁用)

[root@iZ94degopx4Z ~]# sysctl -a | grep 'net.ipv4.tcp_*'
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_retrans_collapse = 1
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_abort_on_overflow = 0
net.ipv4.tcp_stdurg = 0
net.ipv4.tcp_rfc1337 = 0
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_fack = 1
net.ipv4.tcp_reordering = 3
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_dsack = 1
net.ipv4.tcp_mem = 93504 124672 187008
net.ipv4.tcp_wmem = 4096 16384 3989504
net.ipv4.tcp_rmem = 4096 87380 3989504
net.ipv4.tcp_app_win = 31
net.ipv4.tcp_adv_win_scale = 2
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_frto = 2
net.ipv4.tcp_frto_response = 0
net.ipv4.tcp_low_latency = 0
net.ipv4.tcp_no_metrics_save = 0
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_tso_win_divisor = 3
net.ipv4.tcp_congestion_control = cubic
net.ipv4.tcp_abc = 0
net.ipv4.tcp_mtu_probing = 0
net.ipv4.tcp_base_mss = 512
net.ipv4.tcp_workaround_signed_windows = 0
net.ipv4.tcp_challenge_ack_limit = 100
net.ipv4.tcp_limit_output_bytes = 131072
net.ipv4.tcp_dma_copybreak = 4096
net.ipv4.tcp_slow_start_after_idle = 1
net.ipv4.tcp_available_congestion_control = cubic reno
net.ipv4.tcp_allowed_congestion_control = cubic reno
net.ipv4.tcp_max_ssthresh = 0
net.ipv4.tcp_thin_linear_timeouts = 0
net.ipv4.tcp_thin_dupack = 0
net.ipv4.tcp_min_tso_segs = 2

TCP/IP内核相关优化

编辑内核配置文件:vim /etc/sysctl.conf

net.ipv4.tcp_syncookies=1
表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookie来处理,可防范
少量的ddos SYN攻击。默认为0,表示关闭。

net.ipv4.tcp_tw_reuse=1
表示开启重用。允许将TIME_WAIT套接字重新用于新的TCP连接。默认为0,表示
关闭。重复利用端口和文件描述符资源,提升系统并发量。

net.ipv4.tcp_tw_recycle=1
表示开启TCP连接中TIME_WAIT套接字的快速回收。默认为0,表示关闭。

net.ipv4.tcp_keepalive_time=7200
表示当内核启用TCP keepalive启用时,发送keepalive心跳消息的频度。默认是2
小时。

net.ipv4.tcp_keepalive_intvl=75
TCP保活心跳包发送的时间间隔(单位:秒)

net.ipv4.tcp_keepalive_probes=9
尝试探测的最大次数,如果发送的探测包次数超过该值仍然没有收到对方响应,
则认为连接已失效并关闭连接。

net.ipv4.ip_local_port_range=10000 65000
设置client建立连接,可使用端口的范围(每建立一条连接,都会随机为其分配
一个端口)

net.ipv4.tcp_max_syn_backlog=8192
表示SYN队列的长度,默认为1024。增大队列长度为8192,可以容纳更多等待连
接的TCP连接数 ——TCP半连接队列。

net.ipv4.tcp_max_tw_buckets=180000
表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息;
默认为180000。

net.core.netdev_max_backlog=1000
当网络接口接收数据包的速率比内核处理速率快时,允许送到缓冲队列的数据包
最大数目。

net.core.somaxconn=128
TCP连接队列的大小,用于存放已经建立好的TCP连接,等待服务端应用listener
accept进行处理,默认128 ——TCP连接队列。

net.ipv4.tcp_synack_retries=2
为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。
也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries=2
在内核放弃建立连接之前发送SYN包的数量。

net.ipv4.tcp_fin_timeout=60
对于本端断开的TCP连接,保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开
连接或一直不结束连接或不可预料的进程死亡,默认60秒。

net.ipv4.tcp_window_scaling=1
启用RFC 1323定义的window scaling,要支持超过64KB的TCP窗口,必须启用该值(1表示启用),TCP窗口最大
至1GB,TCP连接双方都启用时才生效,默认为1启用。

net.ipv4.tcp_timestamps=1
TCP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考
RFC 1323)来启用对RTT 的计算,为实现更好的性能应该启用这个选项。

net.ipv4.ip_forward=0
开启ip转发支持,内核开启NAT路由功能。默认值0关闭。

net.ipv4.tcp_rmem=4096 87380 4194304
第一个值是为socket接收缓冲区分配的最少字节数;
第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;
第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖);

net.ipv4.tcp_wmem=4096 16384 4194304
第一个值是为socket发送缓冲区分配的最少字节数;
第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;
第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖);

net.core.wmem_default=8388608
默认的TCP发送缓冲区大小(字节)

net.core.rmem_default=8388608
默认的TCP接收缓冲区大小(字节)

net.core.rmem_max=16777216
TCP最大接收缓冲区大小(字节)

net.core.wmem_max=16777216
TCP最大发送缓冲区大小(字节)

使参数永久生效

sysctl -p

参考链接

  1. http://www.centosdoc.com/linux/linux-kernel-para/
  2. http://easwy.com/blog/archives/enable-ip-forward-on-linux/
  3. http://11696974.blog.51cto.com/11686974/1812588
  4. https://www.ibm.com/developerworks/cn/linux/l-hisock.html